﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyHocPhi.BLL;
using QuanLyHocPhi.GUI.DuLieu;
using QuanLyHocPhi.Model;

namespace QuanLyHocPhi.GUI
{
    /// <summary>
    /// TODO:
    /// - Bổ sung chức năng xem thông tin nộp học phí của sinh viên
    /// </summary>
    public partial class FormDanhSachSinhVien : FormBase
    {
        private bool m_NeedLoadLopGocList = false;
        private bool m_NeedLoadSinhVienList = false;

        public static void SetReadOnlyGrid(DataGridView grid)
        {
            grid.AllowUserToAddRows = false;
            grid.AllowUserToDeleteRows = false;
            grid.ReadOnly = true;
            grid.AutoGenerateColumns = false;
        }

        public FormDanhSachSinhVien(string maLoaiHinhDaoTaoToFocus = null)
        {
            InitializeComponent();

            #region Cấu hình gridSinhVien
            SetReadOnlyGrid(gridSinhVien);

            colSinhVien_MaSinhVien.DataPropertyName = "MaSinhVien";
            colSinhVien_HoDem.DataPropertyName = "HoDem";
            colSinhVien_Ten.DataPropertyName = "Ten";
            colSinhVien_GioiTinh.DataPropertyName = "GioiTinh";
            colSinhVien_NgaySinh.DataPropertyName = "NgaySinh";
            bsSinhVien.DataSource = null;
            gridSinhVien.DataSource = bsSinhVien;
            #endregion
        }

        private void OnLoad(object sender, EventArgs e)
        {
            m_NeedLoadSinhVienList = false;
            m_NeedLoadLopGocList = false;
            NapDanhSachNamTuyenSinh(this.SelectedNamTuyenSinh);
            NapDanhSachLoaiHinhDaoTao(this.SelectedMaLoaiHinhDaoTao);
            m_NeedLoadLopGocList = true;

            NapDanhSachLopGoc();
            m_NeedLoadSinhVienList = true;
            NapDanhSachSinhVien();

            UpdateGuiBySelectedLoaiHinhDaoTao();
            UpdateGUIBySelectedLopGoc();
            UpdateGUIBySelectedSinhVien();
        }

        #region Lớp gốc đang chọn
        private LopGoc SelectedLopGoc
        {
            get
            {
                if (bsLopGoc.DataSource == null)
                    return null;
                if (bsLopGoc.Current == null)
                    return null;
                return bsLopGoc.Current as LopGoc;
            }
        }

        /// <summary>
        /// Mã lớp đang chọn
        /// </summary>
        private string SelectedMaLopGoc
        {
            get
            {
                var lop = this.SelectedLopGoc;
                if (lop != null)
                    return lop.MaLopGoc;
                else
                    return null;
            }
        }
        #endregion

        #region Loại hình đào tạo đang chọn
        private LoaiHinhDaoTao SelectedLoaiHinh
        {
            get
            {
                if (bsLoaiHinhDaoTao.Current == null)
                    return null;
                return bsLoaiHinhDaoTao.Current as Model.LoaiHinhDaoTao;
            }
        }

        private string SelectedMaLoaiHinhDaoTao
        {
            get
            {
                var loaiHinh = this.SelectedLoaiHinh;
                if (loaiHinh == null)
                    return null;
                return loaiHinh.MaLoaiHinh;
            }
        }
        #endregion

        #region Năm tuyển sinh đang chọn
        /// <summary>
        /// Năm tuyển sinh đang chọn
        /// </summary>
        private string SelectedNamTuyenSinh
        {
            get
            {
                if (cbxNamTuyenSinh.SelectedItem == null)
                    return null;
                else
                    return cbxNamTuyenSinh.SelectedItem.ToString();
            }
        }

        #endregion

        #region Sinh viên đang chọn
        private SinhVien SelectedSinhVien
        {
            get
            {
                if (bsSinhVien.Current == null)
                    return null;
                return bsSinhVien.Current as SinhVien;
            }
        }

        private string SelectedMaSinhVien
        {
            get
            {
                var sv = this.SelectedSinhVien;
                if (sv == null)
                    return null;
                return sv.MaSinhVien;
            }
        }
        #endregion

        #region UpdateGUIBySelectedLoaiHinhDaoTao
        private void bsLoaiHinhDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            UpdateGuiBySelectedLoaiHinhDaoTao();
        }

        private void UpdateGuiBySelectedLoaiHinhDaoTao()
        {
            menuLoaiHinh_Sua.Enabled = menuLoaiHinh_Xoa.Enabled = bsLoaiHinhDaoTao.Current != null;
            if (m_NeedLoadLopGocList)
                NapDanhSachLopGoc();
        }
        #endregion

        #region UpdateGUIBySelectedNamTuyenSinh
        private void cbxNamTuyenSinh_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (m_NeedLoadLopGocList)
                NapDanhSachLopGoc();
        }
        #endregion

        #region UpdateGUIBySelectedLopGoc
        private void bsLopGoc_CurrentChanged(object sender, EventArgs e)
        {
            UpdateGUIBySelectedLopGoc();
            if (m_NeedLoadSinhVienList)
                NapDanhSachSinhVien();
        }

        private void UpdateGUIBySelectedLopGoc()
        {
            var lopGoc = this.SelectedLopGoc;
            if (lopGoc == null)
            {
                btnLop_Sua.Enabled = btnLop_Xoa.Enabled = false;
            }
            else
            {
                btnLop_Sua.Enabled = btnLop_Xoa.Enabled = true;
            }
        }
        #endregion

        #region UpdateGUIBySelectedSinhVien
        private void OnBsSinhVienCurrentChanged(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            btnSinhVien_Sua.Enabled = btnSinhVien_Xoa.Enabled = selectedSinhVien != null;
        }

        private void UpdateGUIBySelectedSinhVien()
        {
            var sv = this.SelectedSinhVien;
            if (sv == null)
            {
                btnSinhVien_Sua.Enabled = btnSinhVien_Xoa.Enabled = false;
            }
            else
            {
                btnSinhVien_Sua.Enabled = btnSinhVien_Xoa.Enabled = true;
            }
        }
        #endregion

        private void NapDanhSachNamTuyenSinh(string namTuyenSinhToFocus = null)
        {
            var lstNamTuyenSinh = BizLopGoc.GetListNamTuyenSinh();
            cbxNamTuyenSinh.DataSource = lstNamTuyenSinh;
            for (int i = 0; i < lstNamTuyenSinh.Count; i++)
                if (lstNamTuyenSinh[i] == namTuyenSinhToFocus)
                {
                    cbxNamTuyenSinh.SelectedIndex = i;
                    break;
                }
        }

        private void NapDanhSachLoaiHinhDaoTao(string maLoaiHinhDaoTaoToFocus = null)
        {
            var lstLoaiHinh = BizLoaiHinhDaoTao.GetListLoaiHinhDaoTao();
            bsLoaiHinhDaoTao.DataSource = lstLoaiHinh;
            cbxLoaiHinhDaoTao.DisplayMember = "TenLoaiHinh";
            cbxLoaiHinhDaoTao.DataSource = bsLoaiHinhDaoTao;
            for (int i = 0; i < lstLoaiHinh.Count; i++)
                if (lstLoaiHinh[i].MaLoaiHinh == maLoaiHinhDaoTaoToFocus)
                {
                    bsLoaiHinhDaoTao.Position = i;
                    break;
                }
            UpdateGuiBySelectedLoaiHinhDaoTao();
        }

        private void NapDanhSachLopGoc(string maLopToFocus = null)
        {
            SetReadOnlyGrid(gridLopGoc);
            gridLopGoc.DataSource = null;

            var loaiHinh = this.SelectedLoaiHinh;
            var namTuyenSinh = this.SelectedNamTuyenSinh;
            if (loaiHinh == null || namTuyenSinh.IsNullOrEmpty())
                bsLopGoc.DataSource = null;
            else
            {
                var lstLopGoc = BLL.BizLopGoc.GetListLopGoc(loaiHinh.MaLoaiHinh, namTuyenSinh);
                bsLopGoc.DataSource = lstLopGoc;
                for (int i = 0; i < lstLopGoc.Count; i++)
                    if (lstLopGoc[i].MaLopGoc == maLopToFocus)
                    {
                        bsLopGoc.Position = i;
                        break;
                    }
            }
            colLop_MaLop.DataPropertyName = "MaLopGoc";
            colLop_MaLop.Visible = false;
            colLop_TenLop.DataPropertyName = "TenLopGoc";
            gridLopGoc.AutoGenerateColumns = false;
            gridLopGoc.DataSource = bsLopGoc;
            lblTruong_ThongKeSoLop.Text = string.Format("Danh sách có {0} lớp", bsLopGoc.Count);
            UpdateGUIBySelectedLopGoc();
        }

        private void NapDanhSachSinhVien(string maSinhVienToFocus = null)
        {
            var lopGoc = this.SelectedLopGoc;
            gridSinhVien.DataSource = null;

            if (lopGoc == null)
            {
            }
            else
            {
                var lstSinhVien = BLL.BizSinhVien.GetListSinhVien(lopGoc.MaLopGoc);
                bsSinhVien.DataSource = lstSinhVien;
                SetReadOnlyGrid(gridSinhVien);
                gridSinhVien.DataSource = bsSinhVien;
                for (int i = 0; i < lstSinhVien.Count; i++)
                    if (lstSinhVien[i].MaSinhVien == maSinhVienToFocus)
                    {
                        bsSinhVien.Position = i;
                        break;
                    }
            }
            UpdateGUIBySelectedSinhVien();
        }

        #region Thêm, sửa, xoá Loại hình đào tạo
        private void mnuLoaiHinh_BoSung_Click(object sender, EventArgs e)
        {
            // Bổ sung loại hình đào tạo
            var x = new LoaiHinhDaoTao() { MaLoaiHinh = "", TenLoaiHinh = "" };
            var frm = new FormLoaiHinh_Details(true, x);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                try
                {
                    m_NeedLoadLopGocList = true;
                    NapDanhSachLoaiHinhDaoTao(frm.LoaiHinhDaoTao.MaLoaiHinh);
                }
                finally
                {
                    m_NeedLoadLopGocList = false;
                }
                NapDanhSachLopGoc();
            }
        }

        private void menuLoaiHinh_Sua_Click(object sender, EventArgs e)
        {
            // Sửa loại hình đào tạo đang chọn trong cbx
            var x = this.SelectedLoaiHinh;
            if (x == null)
                return;
            var frm = new FormLoaiHinh_Details(false, x);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                try
                {
                    m_NeedLoadLopGocList = true;
                    NapDanhSachLoaiHinhDaoTao(x.MaLoaiHinh);
                }
                finally
                {
                    m_NeedLoadLopGocList = false;
                }
                NapDanhSachLopGoc();
            }
        }

        private void menuLoaiHinh_Xoa_Click(object sender, EventArgs e)
        {
            var x = this.SelectedLoaiHinh;
            if (x == null)
                return;
            try
            {
                m_NeedLoadLopGocList = true;
                BLL.BizLoaiHinhDaoTao.Delete(x);
                NapDanhSachLoaiHinhDaoTao();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Không thể xoá loại hình đào tạo được.\nChi tiết lỗi: " + exc.Message);
            }
            finally
            {
                m_NeedLoadLopGocList = false;
            }
            NapDanhSachLopGoc();
        }
        #endregion

        #region Thêm, xoá, sửa thông tin Lớp gốc
        private void OnAdd_LopClick(object sender, EventArgs e)
        {
            string namTuyenSinh = this.SelectedNamTuyenSinh;
            if (namTuyenSinh.IsNullOrEmpty())
                namTuyenSinh = DateTime.Now.Year.ToString();

            LopGoc newLop = new LopGoc()
            {
                MaLopGoc = Guid.NewGuid().ToString(),
                MaLoaiHinhDaoTao = this.SelectedMaLoaiHinhDaoTao,
                NamTuyenSinh = namTuyenSinh,
                TenLopGoc = ""
            };
            FormLop_Details frm = new FormLop_Details(isAdding: true, pLop: newLop);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Nạp danh sách trường, năm tuyển sinh, danh sách lớp tương ứng
                this.LockUpdate();
                m_NeedLoadLopGocList = false;
                m_NeedLoadSinhVienList = false;
                NapDanhSachLoaiHinhDaoTao(newLop.MaLoaiHinhDaoTao);
                NapDanhSachNamTuyenSinh(newLop.NamTuyenSinh);
                m_NeedLoadLopGocList = true;
                NapDanhSachLopGoc(newLop.MaLopGoc);
                m_NeedLoadSinhVienList = true;
                NapDanhSachSinhVien();
                this.UnlockUpdate();
            }
        }

        private void OnEdit_LopClick(object sender, EventArgs e)
        {
            LopGoc lop = this.SelectedLopGoc;
            if (lop != null)
            {
                FormLop_Details frm = new FormLop_Details(isAdding: false, pLop: lop);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    // Nạp danh sách trường, năm tuyển sinh, danh sách lớp tương ứng
                    this.LockUpdate();
                    m_NeedLoadLopGocList = false;
                    m_NeedLoadSinhVienList = false;
                    NapDanhSachLoaiHinhDaoTao(lop.MaLoaiHinhDaoTao);
                    NapDanhSachNamTuyenSinh(lop.NamTuyenSinh);
                    m_NeedLoadLopGocList = true;
                    NapDanhSachLopGoc(lop.MaLopGoc);
                    m_NeedLoadSinhVienList = true;
                    NapDanhSachSinhVien();
                    this.UnlockUpdate();
                }
            }
        }

        private void OnDelete_LopClick(object sender, EventArgs e)
        {
            LopGoc lop = this.SelectedLopGoc;
            if (lop != null)
            {
                try
                {
                    BizLopGoc.DeleteLopGoc(lop.MaLopGoc);
                    btnLop_NapLai.PerformClick();
                }
                catch (Exception exc)
                {
                    string msg = "Không thể xoá lớp được.\nChi tiết lỗi: " + exc.Message;
                    DialogUtils.ShowError(msg);
                }
            }
        }
        #endregion

        #region Thêm, sửa, xoá sinh viên
        private void OnSinhVien_XoaClick(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            if (selectedSinhVien == null)
                return;
            try
            {
                BizSinhVien.DeleteSinhVien(selectedSinhVien);
                NapDanhSachSinhVien();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Không thể xoá sinh viên được.\nChi tiết lỗi " + exc.Message);
            }
        }

        private void OnSinhVien_SuaClick(object sender, EventArgs e)
        {
            SinhVien selectedSinhVien = this.SelectedSinhVien;
            if (selectedSinhVien == null)
                return;
            var frm = new DuLieu.FormSinhVien_Details(sinhVien: selectedSinhVien, isAddingNew: false);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapDanhSachSinhVien(selectedSinhVien.MaSinhVien);
            }
            frm = null;
        }

        private void OnSinhVien_BoSungClick(object sender, EventArgs e)
        {
            LopGoc selectedLop = this.SelectedLopGoc;
            SinhVien sv = new SinhVien
            {
                MaSinhVien = "",
                HoDem = "",
                Ten = "",
                GioiTinh = true,
                NgaySinh = "",
                GhiChu = "",
                LopGoc = selectedLop,
                MaLopGoc = selectedLop.MaLopGoc
            };
            var frm = new DuLieu.FormSinhVien_Details(sv, isAddingNew: true);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                NapDanhSachSinhVien(sv.MaSinhVien);
            }
        }
        #endregion

        #region Import/Restore danh sách sinh viên
        private void lnkImportSinhVien_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var frm = new DuLieu.FormSinhVien_Import();
            if (this.WindowState == FormWindowState.Maximized)
                this.WindowState = FormWindowState.Maximized;
            else
            {
                frm.Size = this.Size;
                frm.Location = this.Location;
                frm.StartPosition = FormStartPosition.Manual;
            }
            frm.ShowDialog();

            if (frm.SuccessfullyImported)
            {
                m_NeedLoadSinhVienList = false;
                m_NeedLoadLopGocList = false;
                NapDanhSachNamTuyenSinh(frm.LastNamTuyenSinh);
                NapDanhSachLoaiHinhDaoTao(frm.LastMaLoaiHinhDaoTao);
                m_NeedLoadLopGocList = true;

                NapDanhSachLopGoc();
                m_NeedLoadSinhVienList = true;
                NapDanhSachSinhVien();

                UpdateGuiBySelectedLoaiHinhDaoTao();
                UpdateGUIBySelectedLopGoc();
                UpdateGUIBySelectedSinhVien();
            }
        }
        #endregion

        private void OnGridLopCellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.SelectedLopGoc != null && e.RowIndex >= 0)
                btnLop_Sua.PerformClick();
        }

        private void OnGridSinhVienCellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && this.SelectedSinhVien != null)
                btnSinhVien_Sua.PerformClick();
        }

        private void OnBsSinhVienListChanged(object sender, ListChangedEventArgs e)
        {
            lblLop_ThongKeSoSinhVien.Text = string.Format("Danh sách có {0} sinh viên", bsSinhVien.Count);
        }

        private void OnBsLopListChanged(object sender, ListChangedEventArgs e)
        {
            lblTruong_ThongKeSoLop.Text = string.Format("Danh sách có {0} lớp", bsLopGoc.Count);
        }

        private void chuyenButton_Click(object sender, EventArgs e)
        {
            //Thực hiện chuyển danh sách sinh viên của một lớp sang lớp khác (Lớp gốc)
            LopGoc lop = this.SelectedLopGoc;
            if (lop != null)
            {
                try
                {
                    GUI.DuLieu.SelectLopSinhHoatDialog frm =
                        new SelectLopSinhHoatDialog(lop);
                    if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        LopGoc lopMoi = frm.SelectedLop;
                        if (lop == null)
                            return;
                    }

                }
                catch
                {

                }
            }
        }

        // Nạp lại danh sách năm tuyển sinh
        private void lnkNamTuyenSinh_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            m_NeedLoadLopGocList = false;
            string selectedNamTuyenSinh = null;
            if (cbxNamTuyenSinh.SelectedItem != null)
                selectedNamTuyenSinh = cbxNamTuyenSinh.SelectedItem.ToString();
            NapDanhSachNamTuyenSinh(selectedNamTuyenSinh);
            m_NeedLoadLopGocList = true;
            NapDanhSachLopGoc();
        }

        // Nạp lại danh sách lớp gốc
        private void btnLop_NapLai_Click(object sender, EventArgs e)
        {
            var selectedMaLopGoc = this.SelectedMaLopGoc;
            m_NeedLoadSinhVienList = false;
            NapDanhSachLopGoc(selectedMaLopGoc);
            m_NeedLoadSinhVienList = true;
            NapDanhSachSinhVien();
        }

        // Nạp lại danh sách sinh viên
        private void btnSinhVien_NapLai_Click(object sender, EventArgs e)
        {
            var selectedMaSinhVien = this.SelectedMaSinhVien;
            NapDanhSachSinhVien(selectedMaSinhVien);
        }
    }
}
